package com.example.day4.framework.mybatis;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;

public class TestSerializable {
    public static void main(String[] args) throws Exception {
        // 这种方式就可以把我们的函数对象在实现了Type1接口的情况下同时实现Serializable接口
        Type1 lambda = (Type1 & Serializable) Student::getName;

        // 函数对象 <=> 字节码 在序列化时会额外的写入一些信息,运行时就可以根据这些信息找到属性,从而进一步确定 列名
        /*for (Method declaredMethod : lambda.getClass().getDeclaredMethods()) {
            System.out.println(declaredMethod);
        }*/
        SerializedLambda invoke = (SerializedLambda) lambda.getClass().getDeclaredMethod("writeReplace").invoke(lambda);
        // invoke 是一个新对象,包含了原始函数对象字节码,还包含了类和方法的额外信息
        System.out.println(invoke.getClass());

        System.out.println(invoke.getCapturingClass()); // 哪个类使用了这个函数对象
        System.out.println(invoke.getImplClass()); // 哪个类实现了函数对象的逻辑
        System.out.println(invoke.getImplMethodName());// 哪个方法实现了函数对象的逻辑
    }

    interface Type1 {
        String abc(Student student);
    }
}
